import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const request = axios.create({
  baseURL: '', // 使用vite.config.js中的代理配置
  timeout: 5000
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 获取认证信息
    const token = localStorage.getItem('token')
    const role = localStorage.getItem('role')
    const stuId = localStorage.getItem('stuId')
    const name = localStorage.getItem('name')

    // 设置通用请求头
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    if (role) {
      config.headers['User-Role'] = role
    }
    if (stuId) {
      config.headers['User-StuId'] = stuId
    }
    if (name) {
      // 对中文字符进行URL编码，避免非ISO-8859-1字符错误
      config.headers['User-Name'] = encodeURIComponent(name)
    }

    // 打印请求信息用于调试
    console.log('Request config:', {
      url: config.url,
      method: config.method,
      headers: config.headers,
      params: config.params,
      data: config.data
    })

    return config
  },
  error => {
    console.error('Request error:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    console.log('Response received:', {
      url: response.config.url,
      status: response.status,
      data: response.data
    })

    if (response.status === 200) {
      // 检查响应数据结构
      if (!response.data) {
        console.error('Response missing data field:', response)
        return Promise.reject(new Error('响应数据格式错误'))
      }

      // 检查业务状态码 - 只有code为负数才认为是真正的错误
      // code为0的情况通常是业务提示信息，不应该抛出异常
      if (response.data.code !== undefined && response.data.code < 0) {
        const errorMsg = response.data.message || response.data.msg || '请求失败'
        console.error('Business error:', errorMsg, response.data)
        ElMessage.error(errorMsg)
        return Promise.reject(new Error(errorMsg))
      }
      
      // 对于code为1的成功响应，直接返回
      // 对于其他code值（如2、3等），也认为是成功响应，不抛出错误

      return response
    } else {
      const errorMsg = response.data?.message || response.data?.msg || '请求失败'
      console.error('HTTP error:', errorMsg, response)
      ElMessage.error(errorMsg)
      return Promise.reject(new Error(errorMsg))
    }
  },
  error => {
    console.error('Network error:', {
      url: error.config?.url,
      message: error.message,
      response: error.response?.data
    })

    let errorMsg = '请求失败'
    if (error.response) {
      // 服务器返回了错误响应
      if (error.response.status === 404) {
        errorMsg = '接口不存在'
      } else if (error.response.status === 401) {
        errorMsg = '未授权，请重新登录'
      } else if (error.response.status === 403) {
        errorMsg = '没有权限访问'
      } else if (error.response.data?.message) {
        errorMsg = error.response.data.message
      } else if (error.response.data?.msg) {
        errorMsg = error.response.data.msg
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      errorMsg = '服务器无响应'
    } else {
      // 请求配置出错
      errorMsg = error.message
    }

    ElMessage.error(errorMsg)
    return Promise.reject(error)
  }
)

export default request;
